C.S.Burner 🪙 ━►🔥GIT Node
Node / reticulum_mirror / MeshChatX / files / meshchatx / src / frontend / components / messages / ConversationDropDownMenu.vue
Displaying Raw • Download
meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue aeceb30d67ef2ff9ebf411a73daaab18438c5113 (aeceb30d) Text, 15.39 KB
T8b949e<!-- SPDX-License-Identifier: 0BSD AND MIT -->
Tff7b72<templateTff7b72>
Tff7b72<DropDownMenu Te6edf3v-if=Ta5d6ff"Ta5d6ffcompactTa5d6ff"Tff7b72>
Tff7b72<template #buttonTff7b72>
Tff7b72<IconButtonTff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffdots-verticalTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-7Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72</template>
Tff7b72<template #itemsTff7b72>
Tff7b72<DropDownMenuItem Te6edf3v-if=Ta5d6ff"Ta5d6ffhasFailedMessagesTa5d6ff" @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffretry-failedTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffrefreshTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>{{ Te6edf3$t("messages.retry_failed") }}Tff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffstart-callTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffphoneTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>{{ Te6edf3$t("messages.start_call") }}Tff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffshare-contactTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffnotebook-outlineTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>{{ Te6edf3$t("messages.share_contact") }}Tff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Ta5d6ffonPingDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffflashTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>Ping DestinationTff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffopen-telemetry-historyTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffsatellite-variantTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>{{ Te6edf3$t("messages.telemetry_history") }}Tff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<div Te6edf3v-if=Ta5d6ff"Ta5d6ffGlobalState?.config?.telemetry_enabledTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffborder-tTa5d6ff"Tff7b72>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Ta5d6ffonToggleTelemetryTrustTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon
Te6edf3:icon-name=Ta5d6ff"Ta5d6ffcontact?.is_telemetry_trusted ? Ta5d6ff'Ta5d6ffshield-checkTa5d6ff'Ta5d6ff : Ta5d6ff'Ta5d6ffshield-outlineTa5d6ff'Ta5d6ff"
Te6edf3:class=Ta5d6ff"Ta5d6ffcontact?.is_telemetry_trusted ? Ta5d6ff'Ta5d6fftext-blue-500Ta5d6ff'Ta5d6ff : Ta5d6ff'Ta5d6fftext-gray-500Ta5d6ff'Ta5d6ff"
Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff"
Tff7b72/>
Tff7b72<spanTff7b72>{{
contact?.is_telemetry_trusted
? Te6edf3$t("app.telemetry_trust_revoke")
: Te6edf3$t("app.telemetry_trust_grant")
}}Tff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72</div>
Tff7b72<div Te6edf3class=Ta5d6ff"Ta5d6ffborder-t border-gray-100 dark:border-zinc-800Ta5d6ff" Tff7b72/>
T8b949e<!-- set custom display name button -->
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Ta5d6ffonSetCustomDisplayNameTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffaccount-editTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>Set Custom Display NameTff7b72</span>
Tff7b72</DropDownMenuItem>
T8b949e<!-- popout button -->
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffpopoutTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffopen-in-newTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72<spanTff7b72>{{ Te6edf3$t("messages.pop_out_chat") }}Tff7b72</span>
Tff7b72</DropDownMenuItem>
T8b949e<!-- block/unblock button -->
Tff7b72<div Te6edf3class=Ta5d6ff"Ta5d6ffborder-tTa5d6ff"Tff7b72>
Tff7b72<DropDownMenuItem Te6edf3v-if=Ta5d6ff"Ta5d6ff!isBlockedTa5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonBlockDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffgavelTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72<span Te6edf3class=Ta5d6ff"Ta5d6fftext-red-500Ta5d6ff"Tff7b72>Banish UserTff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72<DropDownMenuItem v-else @Te6edf3click=Ta5d6ff"Ta5d6ffonUnblockDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffcheck-circleTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-green-500Ta5d6ff" Tff7b72/>
Tff7b72<span Te6edf3class=Ta5d6ff"Ta5d6fftext-green-500Ta5d6ff"Tff7b72>Lift BanishmentTff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72</div>
T8b949e<!-- delete message history button -->
Tff7b72<div Te6edf3class=Ta5d6ff"Ta5d6ffborder-tTa5d6ff"Tff7b72>
Tff7b72<DropDownMenuItem @Te6edf3click=Ta5d6ff"Ta5d6ffonDeleteMessageHistoryTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffdeleteTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72<span Te6edf3class=Ta5d6ff"Ta5d6fftext-red-500Ta5d6ff"Tff7b72>Delete Message HistoryTff7b72</span>
Tff7b72</DropDownMenuItem>
Tff7b72</div>
Tff7b72</template>
Tff7b72</DropDownMenu>
Tff7b72<div v-else Te6edf3class=Ta5d6ff"Ta5d6ffflex items-center gap-0.5 sm:gap-1 flex-wrap justify-end max-w-[min(100%,52vw)] sm:max-w-noneTa5d6ff"Tff7b72>
Tff7b72<IconButton
Te6edf3v-if=Ta5d6ff"Ta5d6ffhasFailedMessagesTa5d6ff"
Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.retry_failedTa5d6ff'Ta5d6ff)Ta5d6ff"
Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff"
@Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffretry-failedTa5d6ff'Ta5d6ff)Ta5d6ff"
Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffrefreshTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.start_callTa5d6ff'Ta5d6ff)Ta5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffstart-callTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffphoneTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.share_contactTa5d6ff'Ta5d6ff)Ta5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffshare-contactTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffnotebook-outlineTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3title=Ta5d6ff"Ta5d6ffPing DestinationTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonPingDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffflashTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.telemetry_historyTa5d6ff'Ta5d6ff)Ta5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffopen-telemetry-historyTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffsatellite-variantTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton
Te6edf3v-if=Ta5d6ff"Ta5d6ffGlobalState?.config?.telemetry_enabledTa5d6ff"
Te6edf3:title=Ta5d6ff"Ta5d6ffcontact?.is_telemetry_trusted ? Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffapp.telemetry_trust_revokeTa5d6ff'Ta5d6ff) : Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffapp.telemetry_trust_grantTa5d6ff'Ta5d6ff)Ta5d6ff"
Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff"
@Te6edf3click=Ta5d6ff"Ta5d6ffonToggleTelemetryTrustTa5d6ff"
Tff7b72>
Tff7b72<MaterialDesignIcon
Te6edf3:icon-name=Ta5d6ff"Ta5d6ffcontact?.is_telemetry_trusted ? Ta5d6ff'Ta5d6ffshield-checkTa5d6ff'Ta5d6ff : Ta5d6ff'Ta5d6ffshield-outlineTa5d6ff'Ta5d6ff"
Te6edf3:class=Ta5d6ff"Ta5d6ffcontact?.is_telemetry_trusted ? Ta5d6ff'Ta5d6fftext-blue-500Ta5d6ff'Ta5d6ff : Ta5d6ff'Ta5d6fftext-gray-500Ta5d6ff'Ta5d6ff"
Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff"
Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.custom_display_nameTa5d6ff'Ta5d6ff)Ta5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonSetCustomDisplayNameTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffaccount-editTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3:title=Ta5d6ff"Te6edf3$tTa5d6ff(Ta5d6ff'Ta5d6ffmessages.pop_out_chatTa5d6ff'Ta5d6ff)Ta5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Te6edf3$emitTa5d6ff(Ta5d6ff'Ta5d6ffpopoutTa5d6ff'Ta5d6ff)Ta5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffopen-in-newTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3v-if=Ta5d6ff"Ta5d6ff!isBlockedTa5d6ff" Te6edf3title=Ta5d6ff"Ta5d6ffBanish UserTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonBlockDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffgavelTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton v-else Te6edf3title=Ta5d6ff"Ta5d6ffLift BanishmentTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonUnblockDestinationTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffcheck-circleTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-green-500Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72<IconButton Te6edf3title=Ta5d6ff"Ta5d6ffDelete Message HistoryTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffshrink-0Ta5d6ff" @Te6edf3click=Ta5d6ff"Ta5d6ffonDeleteMessageHistoryTa5d6ff"Tff7b72>
Tff7b72<MaterialDesignIcon Te6edf3icon-name=Ta5d6ff"Ta5d6ffdeleteTa5d6ff" Te6edf3class=Ta5d6ff"Ta5d6ffsize-5 text-red-500Ta5d6ff" Tff7b72/>
Tff7b72</IconButton>
Tff7b72</div>
Tff7b72</template>
Tff7b72<scriptTff7b72>
import DropDownMenu from "../DropDownMenu.vue";
import DropDownMenuItem from "../DropDownMenuItem.vue";
import IconButton from "../IconButton.vue";
import MaterialDesignIcon from "../MaterialDesignIcon.vue";
import DialogUtils from "../../js/DialogUtils";
import GlobalState from "../../js/GlobalState";
import GlobalEmitter from "../../js/GlobalEmitter";
import ToastUtils from "../../js/ToastUtils";
export default {
name: "ConversationDropDownMenu",
components: {
IconButton,
DropDownMenuItem,
DropDownMenu,
MaterialDesignIcon,
},
props: {
peer: {
type: Object,
required: true,
},
hasFailedMessages: {
type: Boolean,
default: false,
},
compact: {
type: Boolean,
default: true,
},
},
emits: [
"conversation-deleted",
"set-custom-display-name",
"block-status-changed",
"popout",
"view-telemetry-history",
"retry-failed",
"open-telemetry-history",
"start-call",
"share-contact",
],
data() {
return {
contact: null,
GlobalState,
pingInFlight: false,
};
},
computed: {
isBlocked() {
if (!this.peer) {
return false;
}
return GlobalState.blockedDestinations.some((b) => b.destination_hash === this.peer.destination_hash);
},
},
watch: {
peer: {
immediate: true,
handler() {
this.fetchContact();
},
},
},
mounted() {
GlobalEmitter.on("contact-updated", this.onContactUpdated);
},
unmounted() {
GlobalEmitter.off("contact-updated", this.onContactUpdated);
},
methods: {
onContactUpdated(data) {
if (this.peer?.destination_hash === data.remote_identity_hash) {
this.fetchContact();
}
},
async fetchContact() {
if (!this.peer || !this.peer.destination_hash) return;
try {
const response = await window.api.get(`/api/v1/telephone/contacts/check/${this.peer.destination_hash}`);
if (response.data.is_contact) {
this.contact = response.data.contact;
} else {
this.contact = null;
}
} catch (e) {
console.error("Failed to fetch contact", e);
}
},
async onToggleTelemetryTrust() {
const newStatus = !this.contact?.is_telemetry_trusted;
try {
if (!this.contact) {
// create contact first
await window.api.post("/api/v1/telephone/contacts", {
name: this.peer.display_name,
remote_identity_hash: this.peer.destination_hash,
is_telemetry_trusted: true,
});
await this.fetchContact();
} else {
await window.api.patch(`/api/v1/telephone/contacts/${this.contact.id}`, {
is_telemetry_trusted: newStatus,
});
this.contact.is_telemetry_trusted = newStatus;
}
GlobalEmitter.emit("contact-updated", {
remote_identity_hash: this.peer.destination_hash,
is_telemetry_trusted: newStatus,
});
DialogUtils.alert(
newStatus
? this.$t("app.telemetry_trust_granted_alert")
: this.$t("app.telemetry_trust_revoked_alert")
);
} catch (e) {
DialogUtils.alert(this.$t("app.telemetry_trust_failed"));
console.error(e);
}
},
async onBlockDestination() {
if (
!(await DialogUtils.confirm(
"Are you sure you want to banish this user? They will not be able to send you messages or establish links."
))
) {
return;
}
try {
await window.api.post("/api/v1/blocked-destinations", {
destination_hash: this.peer.destination_hash,
});
GlobalEmitter.emit("block-status-changed");
DialogUtils.alert(this.$t("messages.user_banished"));
this.$emit("block-status-changed");
} catch (e) {
DialogUtils.alert(this.$t("messages.failed_banish_user"));
console.log(e);
}
},
async onUnblockDestination() {
try {
await window.api.delete(`/api/v1/blocked-destinations/${this.peer.destination_hash}`);
GlobalEmitter.emit("block-status-changed");
DialogUtils.alert(this.$t("banishment.banishment_lifted"));
this.$emit("block-status-changed");
} catch (e) {
DialogUtils.alert(this.$t("banishment.failed_lift_banishment"));
console.log(e);
}
},
async onDeleteMessageHistory() {
// ask user to confirm deleting conversation history
if (!(await DialogUtils.confirm(this.$t("messages.delete_history_confirm")))) {
return;
}
try {
await window.api.delete(`/api/v1/lxmf-messages/conversation/${this.peer.destination_hash}`);
this.$emit("conversation-deleted");
} catch (e) {
DialogUtils.alert(this.$t("messages.failed_delete_history"));
console.log(e);
}
},
async onSetCustomDisplayName() {
this.$emit("set-custom-display-name");
},
async onPingDestination() {
if (!this.peer || !this.peer.destination_hash) {
DialogUtils.alert(this.$t("messages.invalid_destination_hash"));
return;
}
const destinationHash = this.peer.destination_hash;
if (destinationHash.length !== 32 || !/^[0-9a-fA-F]+$/.test(destinationHash)) {
DialogUtils.alert(this.$t("messages.invalid_destination_hash_format"));
return;
}
if (this.pingInFlight) {
return;
}
this.pingInFlight = true;
const pingToastKey = "conversation-ping";
ToastUtils.loading(this.$t("messages.ping_in_progress"), 0, pingToastKey);
try {
const response = await window.api.get(`/api/v1/ping/${destinationHash}/lxmf.delivery`, {
params: {
timeout: 30,
},
});
const pingResult = response.data.ping_result;
const rttMilliseconds = (pingResult.rtt * 1000).toFixed(3);
const rttDurationString = `${rttMilliseconds} ms`;
const info = [
this.$t("messages.ping_reply_from", { hash: destinationHash }),
this.$t("messages.duration", { duration: rttDurationString }),
this.$t("messages.hops_there", { count: pingResult.hops_there }),
this.$t("messages.hops_back", { count: pingResult.hops_back }),
];
// add signal quality if available
if (pingResult.quality != null) {
info.push(this.$t("messages.signal_quality", { quality: pingResult.quality }));
}
// add rssi if available
if (pingResult.rssi != null) {
info.push(this.$t("messages.rssi_val", { rssi: pingResult.rssi }));
}
// add snr if available
if (pingResult.snr != null) {
info.push(this.$t("messages.snr_val", { snr: pingResult.snr }));
}
// show result
DialogUtils.alert(info.join("\n"));
} catch (e) {
console.log(e);
const message = e.response?.data?.message ?? this.$t("messages.ping_failed");
DialogUtils.alert(message);
} finally {
ToastUtils.dismiss(pingToastKey);
this.pingInFlight = false;
}
},
},
};
Tff7b72</script>
Served by rngit 1.5.2 - Generated in 0.03s